#ifndef HTTPRESPONSE_H
#define HTTPRESPONSE_H
#include <unordered_map>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include "../buffer/buffer.h"
#include "../log/log.h"
class HttpResponse
{
public:
    //构造函数，用来初始化HttpResponse对象
    HttpResponse();
    //析构函数，用来释放HttpResponse对象占用的资源
    ~HttpResponse();
    //初始化HttpResponse对象，srcDir是资源目录路径，path是请求的文件路径，isKeepAlive是是否保持长连接，code是HTTP的状态码
    void Init(const std::string& srcDir,std::string& path,bool isKeepAlive,int code=-1);
    //构建完整的HTTP响应并写入到输出缓冲区
    //buff是输出缓冲区
    //依次调用私有方法添加状态行、头部和内容
    void MakeResponse(Buffer& buff);
    //解除文件的内存映射，释放资源
    void UnmapFile();
    //获取内存映射的文件指针，用于直接访问文件内容
    char* File();
    //获取响应文件的长度
    size_t FileLen() const;
    //生成错误响应并写入到缓冲区，message是错误信息
    void ErrorContent(Buffer& buff,std::string message);
    //获取HTTP状态码
    int Code() const {return code_;}
private:
    //向响应缓冲区添加HTTP状态行
    void AddStateLine_(Buffer& buff);
    //向响应缓冲区添加HTTP头部
    void AddHeader_(Buffer& buff);
    //向响应缓冲区添加HTTP内容
    void AddContent_(Buffer& buff);
    //生成错误页面的HTML内容
    void ErrorHtml_();
    //获取文件的类型，根据文件后缀名判断
    std::string GetFileType_();
    //HTTP响应的状态码
    int code_;
    //是否保持长连接
    bool isKeepAlive_;
    //请求的文件路径
    std::string path_;
    //资源文件的根目录
    std::string srcDir_;
    //内存映射的文件指针
    char* mmFile_;
    //存储文件状态信息的结构体
    struct stat mmFileStat_;
    //文件类型与MIME类型的映射关系
    static const std::unordered_map<std::string,std::string> SUFFIX_TYPE;
    //HTTP状态码与状态描述的映射关系
    static const std::unordered_map<int,std::string> CODE_STATUS;
    //HTTP状态码与错误页面路径的映射关系
    static const std::unordered_map<int,std::string> CODE_PATH;
};
#endif